import 'colors'
import path from 'path'
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'
import Enquirer from 'enquirer'
import { 字串化2, 是字串, 等几秒 } from './_util.js'
import _ from 'lodash'
const { prompt } = Enquirer

export default await 初始化()

async function 初始化() {
  console.log('初始化检测……')
  let 个人配置, 个人配置文件的绝对路径, 个人配置文件夹的绝对路径, 数据目录
  const 个人配置文件的相对路径 = './.个人配置.json'
  const 目录键名 = '数据夹'
  const 读取个人配置 = (路径 = 个人配置文件的绝对路径) => JSON.parse(readFileSync(路径))
  const 启动完成提示 = () => console.log('\n“海问”启动完成！\n'.green.bold)

  let 个人配置文件的绝对路径遭变
  if (existsSync(个人配置文件的相对路径)) {
    个人配置文件夹的绝对路径 = 读取个人配置(个人配置文件的相对路径)[目录键名]
    if (是字串(个人配置文件夹的绝对路径)) {
      个人配置文件的绝对路径 = path.join(个人配置文件夹的绝对路径, 个人配置文件的相对路径)
      if (existsSync(个人配置文件夹的绝对路径) && existsSync(个人配置文件的绝对路径)) {
        个人配置 = 读取个人配置()
        个人配置.插件 = {
          '油猴 URL': 'https://chrome.google.com/webstore/detail/gcalenpjmijncebpfijmoaglllgpjagf'
        }
        const 个人配置文本内容 = 字串化2(_.merge(读取个人配置(个人配置文件的相对路径), 个人配置))
        writeFileSync(个人配置文件的相对路径, 个人配置文本内容)
        writeFileSync(个人配置文件的绝对路径, 个人配置文本内容)
        await 检测记录存储目录()
        启动完成提示()
        return 个人配置
      }
    }
    个人配置文件的绝对路径遭变 = true
  }

  console.log('\n🟢', `${个人配置文件的绝对路径遭变 ? '（由于你移动或删除了数据存放的文件夹，所以）需要更新文件夹路径' : '这是初次运行'}，请根据提示完成操作${个人配置文件的绝对路径遭变 ? '' : '  （各步按回车键提交）'}`.bgBlue.bold + '\n')

  let stepN = 0, 问题, 输入, 确认
  const 第n步 = (步增 = 1) => `${步增 ? '' : '（重来）'}${第n步.name.replace('n', ` ${stepN += 步增} `)}  `
  const 重来 = () => 问题({ 步增: 0 })

  const 个人配置文件绝对地址配送 = (对象 = { 用户名: '' }) => writeFileSync(个人配置文件的绝对路径, 字串化2(对象))




  问题 = async ({ 步增 } = {}) => {
    const name = '数据目录'
    输入 = await prompt({
      type: 'input',
      name,
      message: `${第n步(步增)}设定存放数据的文件夹\n\n`.yellow.bold + `  请确立${个人配置文件的绝对路径遭变 ? '你上次在此步时设定的文件夹（若你已删了它，你可新建或重新指定一个）' : '或新建一个文件夹'}，` + '将它拖进本窗口'.bold + '，然后敲击回车键\n\n',
      hint: 个人配置文件的绝对路径遭变 ? '' : `（比如在桌面新建一个，并${'重命名'.bold}为你想取的名称）`
    })
    数据目录 = 输入[name]
    if (!existsSync(数据目录)) {
      console.log('\n文件夹路径无效！'.red.bold, `（你提交的是 “${输入[name]}” ）\n`)
      return await 重来()
    }
    个人配置文件的绝对路径 = path.join(数据目录, 个人配置文件的相对路径)
    !existsSync(个人配置文件的绝对路径) && 个人配置文件绝对地址配送()
  }
  await 问题(); console.log()



  问题 = async ({ 步增 } = {}) => {
    const name = '个人配置文件'
    输入 = await prompt({
      type: 'input',
      name,
      message: `${第n步(步增)}设定${name}\n\n`.yellow.bold + `  请按需编辑 ${个人配置文件的绝对路径.green.underline}（见下方提示），保存后回到本窗口回车\n\n`,
      hint: '（💡: 可将光标悬停到上方文件路径 👆 以快捷打开）'.bold.underline
    })
    try {
      个人配置 = 读取个人配置()
      if (个人配置.用户名 === '') {
        console.log('\n你没填用户名！'.red.bold, `（你写的是 “${个人配置.用户名}” ）\n`)
        return await 重来()
      }
    } catch (_) {
      console.log('\nJSON 文件被你修改得不合规范！'.red.bold, `请在编辑器内更正所有标红指示`, `（${'提示：'.bold}字符串须用${'英文双引号'.rainbow.bold}来包裹！）\n`)
      await 等几秒(7)
      return await 重来()
    }
  }
  (!个人配置文件的绝对路径遭变 || !existsSync(个人配置文件的绝对路径)) && await 问题(); console.log()



  确认 = async () => {
    const name = '复制个人配置文件'
    输入 = await prompt({
      type: 'confirm',
      name,
      message: `即将${name}，请确认其已保存，按回车键继续`
    })
    个人配置 = 读取个人配置()
    个人配置[目录键名] = 数据目录
    writeFileSync(个人配置文件的相对路径, 字串化2(个人配置))
    检测记录存储目录()
  }
  await 确认(); console.log()


  确认 = async () => {
    const name = '完成'
    输入 = await prompt({
      type: 'confirm',
      name,
      message: '💚  ' + `${个人配置文件的绝对路径遭变 ? '数据路径修改' : '初始化配置'}完成！`.bgBlue.bold + '\n\n      ' + '按回车键'.yellow.bold + '进入正式程序'
    })
  }
  await 确认(); console.log('\n\n\n')
  启动完成提示()
  return 读取个人配置()

  async function 检测记录存储目录() {
    '标准 过关 陷阱 行进'.split(' ').forEach(记录 => {
      const 路径 = path.join(数据目录 ??= 个人配置文件夹的绝对路径, '记录', 记录)
      !existsSync(路径) && mkdirSync(路径, { recursive: true })
    })
    await import('./打包油猴脚本.js')
  }
}